float       Speed;
float       Rate;
float       NewRate;
integer     DIR_STOP = 100;
integer     DIR_START = 101;
integer     DIR_NORM = 102;
integer     DIR_LEFT = 103;
integer     DIR_RIGHT = 104;
integer     DIR_FLIGHT = 105;

Parts_On()
{
    llParticleSystem([PSYS_PART_MAX_AGE,1.5,
                    PSYS_PART_FLAGS,PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_FOLLOW_SRC_MASK,
                    PSYS_PART_START_COLOR, <1,1,0>,
                    PSYS_PART_END_COLOR, <1,0,0>,
                    PSYS_PART_START_SCALE,<0.6,0.6,0>,
                    PSYS_PART_END_SCALE, <0.25,0.25,0>,
                    PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE,
                    PSYS_SRC_BURST_RATE,0.001,
                    PSYS_SRC_BURST_PART_COUNT,5,
                    PSYS_SRC_BURST_RADIUS,0.3,
                    PSYS_SRC_BURST_SPEED_MIN,0.8,
                    PSYS_SRC_BURST_SPEED_MAX,0.8,
                    PSYS_SRC_ANGLE_BEGIN,0.0, 
                    PSYS_SRC_ANGLE_END,0.0,
                    PSYS_PART_START_ALPHA, 1.0,
                    PSYS_PART_END_ALPHA, 0.0]);
}

default
{
    state_entry()
    {
        if(llGetInventoryType("DT Unpacker") == -1) state Ready;
    }
    
    on_rez(integer param)
    {
        llResetScript();
    }
}

state Ready
{
    state_entry()
    {
        llSetLocalRot(llEuler2Rot(<-PI_BY_TWO, 0.0, 0.0>));
        llSetTextureAnim(0, ALL_SIDES, 0, 0, 0, 0, 0);
        llParticleSystem([]);
    }
    
    link_message(integer sender, integer num, string message, key id)
    {
        if(num == DIR_STOP) llResetScript();
        else if(num == DIR_START)
        {
            llSetTimerEvent(1.0);
            llParticleSystem([]);
        }else if(num == DIR_NORM) llSetLocalRot(llEuler2Rot(<-PI_BY_TWO, 0.0, 0.0>));
        else if(num == DIR_LEFT) llSetLocalRot(llEuler2Rot(<-PI_BY_TWO, -PI_BY_TWO / 2, 0>));
        else if(num == DIR_RIGHT) llSetLocalRot(llEuler2Rot(<-PI_BY_TWO, PI_BY_TWO / 2, 0>));
        else if(num == DIR_FLIGHT)
        {
            llSetLocalRot(llEuler2Rot(<-PI, 0, 0>));
            llSetTimerEvent(0);
            llSetTextureAnim(0, ALL_SIDES, 0, 0, 0, 0, 0);
            Parts_On();
        }
    }
    
    timer()
    {
        Speed = llVecMag(llGetVel());
        if(Speed < 0.4) NewRate = 0.0;
        else if((Speed >= 0.4) && (Speed < 6.0)) NewRate = 3.0;
        else if((Speed >= 6.0) && (Speed < 12.0)) NewRate = 9.0;
        else if((Speed >= 12.0) && (Speed < 18.0)) NewRate = 15.0;
        else if((Speed >= 18.0) && (Speed < 24.0)) NewRate = 21.0;
        else NewRate = 27.0;
        if(Rate != NewRate)
        {
            Rate = NewRate;
            llSetTextureAnim(ANIM_ON | LOOP | SMOOTH | ROTATE, ALL_SIDES, 0, 0, 0, 0, Rate);
        }
    }
}